#pragma once

#include "DatabasePool.hpp"
#include <json/json.h>
#include <cppconn/prepared_statement.h>
#include <cppconn/resultset.h>

using namespace Json;
using namespace std;

/**
 * @brief 数据库工具类
 * 
 * 提供静态方法简化数据库操作，支持：
 * - 直接执行SQL语句
 * - 查询结果转为JSON格式
 * - 事务处理（通过嵌套类实现）
 */
class DBUtil
{
public:
	/**
     * @brief 执行非查询SQL语句（增删改）
     * @param sql 要执行的SQL语句
     * @return int 受影响的行数，-1表示执行失败
     */
	static int execute(const string& sql);
	/**
     * @brief 执行查询SQL语句
	 * 		查询返回类型不同 单独封装
     * @param sql 查询语句
     * @return Value 查询结果（JSON数组格式）
     *        每行数据转为JSON对象，字段名为key
     */
	static Value query(const string& sql);

	/**
     * @brief 事务处理嵌套类
     * 
     * 通过RAII机制管理事务生命周期：
     * - 构造时开启事务
     * - 析构时自动回滚未提交的事务
     */
	class Transaction
	{
	private:
		shared_ptr<Connection> conn_;
		bool active_ = false;
	public:
	     /**
           * @brief 析构函数（自动回滚未提交的事务）
           */
		~Transaction();
		/**
           * @brief 构造函数（自动开启事务）
           * @note 从连接池获取专用连接并设置 autoCommit=false
           */
		
          Transaction();

		/**
           * @brief 提交事务
		 * 		
           * @return bool 提交是否成功
           * @note 提交后事务结束，连接自动归还连接池
           */
		bool commit();
		/**
           * @brief 回滚事务
           * @note 回滚后事务结束，连接自动归还连接池
           */
		void rollback();
		/**
           * @brief 在事务中执行SQL语句
           * @param sql 要执行的SQL
           * @return int 受影响的行数，-1表示失败
           */
		bool execute(const string& sql);
		/**
           * @brief 在事务中执行查询
           * @param sql 查询语句
           * @return Value JSON格式结果集
		 * 		注意与上面 DBUtil 中的同名方法区分
           */
		Value query(const string& sql);

		/**
           * @brief 执行预处理语句（可变参数模板）
           * @tparam Args 参数类型
           * @param sql 预处理语句（带?占位符）
           * @param args 参数值
           * @return int 受影响的行数
           * 
           * 		可变参数 模板类使 sql语句 处理更广泛
           */
		template<typename... Args>
		int ececutePrepared(const string& sql, Args&&... args);
	};
};


